jetcrab\lexer\scanners/
comment.rs1use crate::lexer::{LexerError, TokenKind};
2
3pub trait CommentReader {
4 fn read_line_comment(&mut self) -> Result<TokenKind, LexerError>;
5 fn read_block_comment(&mut self) -> Result<TokenKind, LexerError>;
6}
7
8impl<T> CommentReader for T
9where
10 T: LexerCore + LexerCoreExt,
11{
12 fn read_line_comment(&mut self) -> Result<TokenKind, LexerError> {
13 self.advance_pos();
14 self.advance_pos();
15
16 let mut comment = String::new();
17
18 while self.pos() < self.source().len() {
19 let c = self.source()[self.pos()];
20 if c == '\n' {
21 break;
22 }
23 comment.push(c);
24 self.advance_pos();
25 }
26
27 Ok(TokenKind::Comment(comment))
28 }
29
30 fn read_block_comment(&mut self) -> Result<TokenKind, LexerError> {
31 self.advance_pos();
32 self.advance_pos();
33
34 let mut comment = String::new();
35 let mut found_closing_comment = false;
36
37 while self.pos() < self.source().len() {
38 let c = self.source()[self.pos()];
39
40 if c == '*' && self.peek_char(1) == Some('/') {
41 self.advance_pos();
42 self.advance_pos();
43 found_closing_comment = true;
44 break;
45 }
46
47 comment.push(c);
48 self.advance_pos();
49 }
50
51 if !found_closing_comment {
52 return Err(LexerError::UnterminatedComment);
53 }
54
55 Ok(TokenKind::Comment(comment))
56 }
57}
58
59use crate::lexer::scanners::{LexerCore, LexerCoreExt};